package org.spring.blog.service;

import org.spring.blog.pojo.User;
import org.spring.blog.response.ResponseResult;
import org.spring.blog.utils.LRConstants;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.io.IOException;

public interface IUserService {

    String from_pc = "pc_";
    String from_mobile = "mobile_";

    String redis_pc_scan_login_key = "redis_pc_scan_login_key";
    String cookie_last_get_qr_code_flag = "cookie_last_get_qr_code_flag";
    String cookie_last_captcha_id = "cookie_last_captcha_id";

    /**
     * 获取二维码
     *
     * @return 自定义返回对象
     */
    ResponseResult getPCLoginQrCode();

    /**
     * 检查二维码的状态
     *
     * @return 自定义的返回对象
     */
    ResponseResult checkQrCodeLoginState(String _qrCode);

    /**
     * 更新二维码的状态
     *
     * @return 自定义的返回对象
     */
    ResponseResult updateQrCodeLoginState(String _loginId);


    /**
     * 获取网站注册人数
     *
     * @return 自定义返回对象
     */
    ResponseResult getRegisterCount();

    /**
     * 检查邮箱验证码是否正确
     *
     * @return 自定义返回对象
     */
    ResponseResult checkEmailVerifyCode(String _email, String _verifyCode);

    /**
     * 检查人类验证码是否正确
     *
     * @return 自定义返回对象
     */
    ResponseResult checkCaptchaCode(String _captchaCode);

    /**
     * 该接口里面的常量
     */
    interface constant {
        int list_min_page_size = 5;
        int list_default_page_num = 1;

        String DB_ROLE_ADMIN = "role_admin";
        String DB_ROLE_NORMAL = "role_normal";
        String DB_DEFAULT_AVATAR = "https://cdn.sunofbeaches.com/images/default_avatar.png";
        String db_user_normal_state = "1";
        String db_user_ban_state = "0";

        String REDIS_KEY_CAPTCHA_CONTENT = "key_captcha_content";
        String REDIS_KEY_EMAIL_SEND_IP = "key_email_send_ip";
        String REDIS_KEY_EMAIL_SEND_ADDRESS = "key_email_send_address";
        String REDIS_KEY_EMAIL_SEND_VERIFY_CONTENT = "key_email_send_verify_content";
        String REDIS_TOKEN_KEY = "key_token";

        long redis_verify_code_keep_time = 10L * LRConstants.TimeValue.min_ms;
        long redis_captcha_code_keep_time = 10L * LRConstants.TimeValue.min_ms;
        long redis_max_email_send_num = 100L; // 一定时间发送的最大邮件数 条
        long redis_email_limit_time = LRConstants.TimeValue.hour_ms; //一定时间 小时
        long redis_email_limit_interval_time = 30L; // 两条邮件的间隔时间 秒
        long redis_token_keep_time = 2L * LRConstants.TimeValue.hour_ms; // 两小时

        int cookie_token_key_keep_time = LRConstants.TimeValue.year_s;
        String cookie_token_key = "sob_blog_token";


        long jwt_token_keep_time = 2L * LRConstants.TimeValue.hour_ms; // 两小时
        long jwt_refreshToken_keep_time = LRConstants.TimeValue.moon_ms;
    }

    /**
     * 退出登录
     *
     * @return 自定义返回对象
     */
    ResponseResult logout();

    /**
     * 获取登录着自己的信息
     *
     * @return 自定义返回对象
     */
    ResponseResult getOwnInfo();


    /**
     * 检查用户名的唯一性
     * ///////// 使用场景
     * 1. 用户注册 2. 修改username 昵称
     *
     * @param _username 用户输入的用户名
     * @return 自定义的返回对象
     */
    ResponseResult checkUsernameUnique(String _username, String _ownId);


    /**
     * 检查邮箱的唯一性
     * ///////// 使用场景
     * 1. 用户注册 2. 修改邮箱
     *
     * @param _email 邮箱地址
     * @return 自定义的返回对象
     */
    ResponseResult checkEmailUnique(String _email, String _ownId);


    /**
     * 用户登录
     *
     * @param _captcha 人类验证码信息
     * @param _user    用户信息
     * @param _from    登录途径
     * @return 返回结果信息类
     */
    ResponseResult login(String _captcha, User _user, String _from);


    /**
     * 初始化管理员账户
     *
     * @param _user    用户对象
     * @param _request 请求体
     * @return 自定义返回对象
     */
    ResponseResult initManagerAccount(User _user, HttpServletRequest _request);

    /**
     * 获取人类验证码
     *
     * @param _response 响应体
     * @throws IOException         io异常
     * @throws FontFormatException 不存在的验证码字体
     */
    void createCaptcha(HttpServletResponse _response) throws IOException, FontFormatException;

    /**
     * 发送邮箱验证码
     *
     * @param _request 请求体
     * @param _email   邮箱地址
     * @return 自定义的返回对象
     * <p>
     * 方法要求：
     * <p>
     * 同一个邮箱间隔要15秒
     * 同一个ip最多100此，短信100条 1小时内
     * 验证码保存4分钟
     */
    ResponseResult sendEmailVerifyCode(HttpServletRequest _request, String _email);

    /**
     * 用户注册
     *
     * @param _request     请求体
     * @param _user        用户对象
     * @param _verifyCode  邮箱验证码
     * @param _captchaCode 人类验证码
     * @return 自定义的返回对象
     */
    ResponseResult register(HttpServletRequest _request, User _user, String _verifyCode, String _captchaCode);

    /**
     * 检查用户是否有登录
     *
     * @return 用户对象
     */
    User checkUserIsLogin();

    /**
     * 获取用户信息
     *
     * @param _userId 用户id
     * @return 自定义的返回对象
     */
    ResponseResult getUserInfoById(String _userId);

    /**
     * 更新用户信息
     *
     * @param _userId 用户id
     * @param _user   用户user对象
     * @return 自定义的返回结果对象
     */
    ResponseResult updateUserInfoByUserId(String _userId, User _user);

    /**
     * 封禁用户， 需要管理员权限
     *
     * @param _request  请求体
     * @param _response 响应体
     * @param _userId   用户id
     * @return 自定义的返回结果对象
     */
    ResponseResult deleteUserByUserId(HttpServletRequest _request, HttpServletResponse _response, String _userId);


    /**
     * 获取用户列表
     *
     * @param _page     页码
     * @param _size     页面大小
     * @param _userName 用户名
     * @param _email    邮箱
     * @return 自定义的返回结果对象
     */
    ResponseResult listUsers(int _page, int _size, String _userName, String _email);


    /**
     * 修改密码
     * 步骤
     * 1.用户登录
     * 2.使用用户的邮箱发送验证码
     * 3.用户填写验证码，和新密码
     * 4.服务器验证验证码和密码
     * 5.返回用户信息和更改服务器状态
     *
     * @param _user 用户信息
     * @return 自定义返回对象
     */
    ResponseResult updatePasswordByUserEmail(String _verifyCode, User _user);

    /**
     * 修改邮箱
     * 1.登录状态 2.邮箱唯一
     *
     * @return 自定义返回对象
     */
    ResponseResult updateEmail(String _email, String _verifyCode);
}
